/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.una.pol.tesis.ii.wsrest;

import com.google.gson.Gson;
import com.sun.jersey.api.view.Viewable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import org.apache.log4j.Logger;
import py.una.informatica.core.Emergencia;
import py.una.informatica.dto.AsoDiagnosticoPaciente;
import py.una.informatica.dto.Diagnostico;
import py.una.informatica.dto.Persona;
import py.una.informatica.dto.Respuesta;

/**
 * REST Web Service
 *
 * @author Leandro
 */
@Path("diagnosticos")
@Stateless
public class DiagnosticosResource {

    @Context
    private UriInfo context;

    @EJB
    private Emergencia bean;

    /**
     * Creates a new instance of DiagnosticosResource
     */
    public DiagnosticosResource() {
    }
    
    @GET
    @Path("/index")
    @Produces("text/html")
    public Response index(@Context HttpServletRequest req) {
        Map<String, Object> map = new HashMap<String, Object>();
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, MenuResource.index: " + session.getId());
            
            List<String> permisos = new ArrayList<String>();
            permisos.add("P1");
            permisos.add("P2");
            permisos.add("P3");
            permisos.add("P4");
            
            map.put("permisos", permisos);
            map.put("usuario", "leandrol");
        } catch (Exception e) {
            Logger.getLogger("").info("Error al mostrar el ui diagnostico: ", e);
        }

        return Response.ok(new Viewable("/diagnosticos", map)).build();
    }
    
    @POST
    public String crearDiagnostico(@Context HttpServletRequest req, String entrada) {
        Gson gson = new Gson();
        Respuesta respuesta = new Respuesta();
        String respuestaJson = "";
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.crearDiagnostico: " + session.getId());
            
            Logger.getLogger("").info("Entrada crearDiagnostico: " + entrada);

            Diagnostico diagnostico = gson.fromJson(entrada, Diagnostico.class);
            Logger.getLogger("").info("Clase diagnostico: " + diagnostico.toString());

            respuesta.setEstado("0");
            respuesta.setMensaje("Diagnóstico creado correctamente.");
            respuesta.setDato(null);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta crearDiagnostico: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al crear el Diagnóstico, intente de nuevo más tarde");
            respuesta.setDato(null);
            Logger.getLogger("").info("Error en crearDiagnostico", e);
        }

        return respuestaJson;
    }

    @DELETE
    @Path("{id}")
    public String deleteDiagnostico(@PathParam("id") String id) {

        return "";
    }

    @GET
    @Path("{id}")
    public String getDiagnostico(@Context HttpServletRequest req, @PathParam("id") String id) {
        Gson gson = new Gson();
        Respuesta respuesta = new Respuesta();
        String respuestaJson = "";

        List<Object> diagnosticos = new ArrayList<Object>();
        Diagnostico diagnotico1 = null;
        Diagnostico diagnostico2 = null;

        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.getDiagnostico: " + session.getId());
            
            Logger.getLogger("").info("Entrada getDiagnostico, id: " + id);
            if (id.equals("1")) {
                diagnotico1 = new Diagnostico(1, "Diabetes");
                diagnosticos.add(diagnotico1);
            } else {
                diagnostico2 = new Diagnostico(2, "Presión alta");
                diagnosticos.add(diagnostico2);
            }

            respuesta.setEstado("0");
            respuesta.setMensaje("OK");
            respuesta.setDato(diagnosticos);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta getDiagnostico: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al obtener el detalle del diagnóstico.");
            respuesta.setDato(null);
            Logger.getLogger("").info("Error en getDiagnostico", e);
        }

        return respuestaJson;
    }

    @GET
    public String getDiagnosticos(@Context HttpServletRequest req) {
        Gson gson = new Gson();
        Respuesta respuesta = new Respuesta();
        String respuestaJson = "";
        List<Object> diagnosticos = new ArrayList<Object>();
        Diagnostico diagnostico1 = null;
        Diagnostico diagnostico2 = null;

        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.getDiagnosticos: " + session.getId());
            
            diagnostico1 = new Diagnostico(1, "Diabetes");

            diagnostico2 = new Diagnostico(2, "Presion alta");

            diagnosticos.add(diagnostico1);
            diagnosticos.add(diagnostico2);

            respuesta.setEstado("0");
            respuesta.setMensaje("OK");
            respuesta.setDato(diagnosticos);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta getDiagnosticos: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al obtener los diagnósticos.");
            respuesta.setDato(null);
            Logger.getLogger("").info("Error en getDiagnosticos", e);
        }

        return respuestaJson;
    }

    @PUT
    public String editarDiagnostico(@Context HttpServletRequest req, String entrada) {
        Gson gson = new Gson();
        Respuesta respuesta = new Respuesta();
        String respuestaJson = "";
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.editarDiagnostico: " + session.getId());
            
            Logger.getLogger("").info("Entrada editarDiagnostico: " + entrada);

            Diagnostico diagnostico = gson.fromJson(entrada, Diagnostico.class);
            Logger.getLogger("").info("Clase diagnostico: " + diagnostico.toString());

            respuesta.setEstado("0");
            respuesta.setMensaje("Diagnóstico editado correctamente.");
            respuesta.setDato(null);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta editarDiagnostico: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al editar el diagnóstico, intente de nuevo más tarde");
            respuesta.setDato(null);
            Logger.getLogger("").info("Error en editarDiagnostico: ", e);
        }

        return respuestaJson;
    }

    @GET
    @Path("doctores/{idDiagnostico}")
    public String getDoctoresByDiagnostico(@Context HttpServletRequest req, @PathParam("idDiagnostico") String idDiagnostico) {
        Respuesta respuesta = new Respuesta();
        Persona persona1;
        Persona persona2;
        List<Object> personas = new ArrayList<Object>();
        Gson gson = new Gson();
        String respuestaJson = "";
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.getDoctoresByDiagnostico: " + session.getId());
                        
            persona1 = new Persona();
            persona2 = new Persona();
            Logger.getLogger("").info("Entrada getDoctoresByDiagnostico, idDiagnostico: " + idDiagnostico);
            if (idDiagnostico.equals("1")) {

                persona1.setIdPersona(1);
                persona1.setNombres("Dr. José");
                persona1.setApellidos("Gonzales");

                persona2.setIdPersona(2);
                persona2.setNombres("Dr. Pedro");
                persona2.setApellidos("Luque");
            } else {
                persona1.setIdPersona(1);
                persona1.setNombres("Dra. Josefina");
                persona1.setApellidos("Gonzales");

                persona2.setIdPersona(2);
                persona2.setNombres("Dra. Eliana");
                persona2.setApellidos("Meza");
            }

            personas.add(persona1);
            personas.add(persona2);

            respuesta.setEstado("0");
            respuesta.setMensaje("OK");
            respuesta.setDato(personas);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta getDoctoresByDiagnostico: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al listar los doctores");
            respuesta.setDato(null);
            Logger.getLogger("").error("Error en getDoctoresByDiagnostico", e);
        }
        return respuestaJson;
    }

    @POST
    @Path("pacientes")
    public String crearAsoPacienteDiagnostico(@Context HttpServletRequest req, String entrada) {
        Gson gson = new Gson();
        Respuesta respuesta = new Respuesta();
        String respuestaJson = "";
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.crearAsoPacienteDiagnostico: " + session.getId());
            
            Logger.getLogger("").info("Entrada crearAsoPacienteDiagnostico: " + entrada);
            AsoDiagnosticoPaciente aso = gson.fromJson(entrada, AsoDiagnosticoPaciente.class);            
            Logger.getLogger("").info("Clase AsoDiagnosticoPaciente: " + aso.toString());
           
            respuesta.setEstado("0");
            respuesta.setMensaje("Asociación realizada con éxito.");
            respuesta.setDato(null);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta crearAsoPacienteDiagnostico: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al asociar el diagnóstico al paciente, intente de nuevo más tarde");
            respuesta.setDato(null);
            Logger.getLogger("").info("Error en crearAsoPacienteDiagnostico", e);
        }

        return respuestaJson;
    }

    @GET
    @Path("pacientes")
    public Response getDiagnosticosPacientes(@Context HttpServletRequest req) {
        Gson gson = new Gson();
        String respuestaJson = "";
        List<Object> asoc = new ArrayList<Object>();
        AsoDiagnosticoPaciente aso1 = null;
        AsoDiagnosticoPaciente aso2 = null;
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.getDiagnosticosPacientes: " + session.getId());
            
            aso1 = new AsoDiagnosticoPaciente("1", "Leandro Luque", "4457533",
                    "Dr. Jose Gonzales", "Diabetes");
            aso2 = new AsoDiagnosticoPaciente("2", "Cynthia Meza", "3361242",
                    "Dr. Jose Gonzales", "Presion Alta");

            asoc.add(aso1);
            asoc.add(aso2);

            respuestaJson = gson.toJson(asoc);
            Logger.getLogger("").info("Respuesta getDiagnosticosPacientes: " + respuestaJson);
        } catch (Exception e) {
            Logger.getLogger("").info("Error en getDiagnosticosPacientes", e);
        }

        return Response.ok(gson.toJson(asoc), MediaType.APPLICATION_JSON).build();
    }

    @GET
    @Path("pacientes/{idDiagnosticoPaciente}")
    public String getDiagnosticoPacientesById(@Context HttpServletRequest req, @PathParam("idDiagnosticoPaciente") String idDiagnosticoPaciente) {
        Respuesta respuesta = new Respuesta();
        AsoDiagnosticoPaciente aso1;
        AsoDiagnosticoPaciente aso2;
        List<Object> personas = new ArrayList<Object>();
        Gson gson = new Gson();
        String respuestaJson = "";
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.getDiagnosticoPacientesById: " + session.getId());
            
            Logger.getLogger("").info("Entrada getDiagnosticoPacientesById, idDiagnosticoPaciente: " + idDiagnosticoPaciente);
            if (idDiagnosticoPaciente.equals("1")) {
                aso1 = new AsoDiagnosticoPaciente("1", "Leandro Luque",
                        "4457533", "Dr. Jose Gonzales", "Diabetes");
                aso2 = new AsoDiagnosticoPaciente("2", "Cynthia Meza", "4457533",
                        "Dr. Jose Gonzales", "Presion Alta");

            } else {
                aso1 = new AsoDiagnosticoPaciente("1", "Leandro Luque",
                        "4457533", "Dr. Jose Gonzales", "Diabetes");
                aso2 = new AsoDiagnosticoPaciente("2", "Cynthia Meza", "4457533",
                        "Dr. Jose Gonzales", "Presion Alta");
            }

            personas.add(aso1);
            personas.add(aso2);

            respuesta.setEstado("0");
            respuesta.setMensaje("OK");
            respuesta.setDato(personas);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta getDiagnosticoPacientesById: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al listar los doctores");
            respuesta.setDato(null);
            Logger.getLogger("").error("Error en getDiagnosticoPacientesById", e);
        }
        return respuestaJson;
    }
    
    @PUT
    @Path("pacientes")
    public String editarDiagnosticoPaciente(@Context HttpServletRequest req, String entrada) {
        Gson gson = new Gson();
        Respuesta respuesta = new Respuesta();
        String respuestaJson = "";
        try {
            HttpSession session = req.getSession(true);
            Logger.getLogger("").info("Session, DiagnosticosResource.editarDiagnosticoPaciente: " + session.getId());
            
            Logger.getLogger("").info("Entrada editarDiagnosticoPaciente: " + entrada);

            AsoDiagnosticoPaciente aso = gson.fromJson(entrada, AsoDiagnosticoPaciente.class);
            Logger.getLogger("").info("Clase AsoDiagnosticoPaciente: " + aso.toString());

            respuesta.setEstado("0");
            respuesta.setMensaje("Asociación editado correctamente.");
            respuesta.setDato(null);

            respuestaJson = gson.toJson(respuesta);
            Logger.getLogger("").info("Respuesta editarDiagnosticoPaciente: " + respuestaJson);
        } catch (Exception e) {
            respuesta.setEstado("-1");
            respuesta.setMensaje("Error al editar la asociación diagnóstico paciente, intente de nuevo más tarde");
            respuesta.setDato(null);
            Logger.getLogger("").info("Error en editarDiagnosticoPaciente: ", e);
        }

        return respuestaJson;
    }
}
